home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / C Internet Config / IC Resource ƒ / IC Link In Subs.c next >
Encoding:
C/C++ Source or Header  |  1995-12-06  |  11.3 KB  |  560 lines  |  [TEXT/SPM ]

  1. /*
  2.     IC Link In Subs.c
  3.     
  4.     C code for more link in stuff.
  5.     
  6. */
  7.  
  8. #include <Processes.h>
  9. #include <AppleEvents.h>
  10. #include <Aliases.h>
  11.  
  12. #include "IC Types.h"
  13. #include "IC Keys.h"
  14.  
  15. #include "IC Link In Subs.h"
  16.  
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20.  
  21. // Local Prototypes
  22. Boolean HaveAliasManager(void);
  23. Boolean FindProcess(OSType creator,OSType typ,ProcessSerialNumber* process,FSSpecPtr fs);
  24. OSErr GetVolInfo(StringPtr name,short* vrn,short index);
  25. OSErr ConfirmAppl(OSType creator,FSSpecPtr fss);
  26. OSErr ScanVolume(OSType creator,short vref,FSSpecPtr fs);
  27. OSErr FindApplication(OSType creator,FSSpecPtr fs);
  28. ICError PrepareToLaunch(AppleEvent* theEvent,Boolean tofront,LaunchParamBlockRec* launchThis);
  29. ICError CreateGURLEvent(OSType creator,Handle urlh,AppleEvent* theEvent);
  30. ICError CreateEditPrefEvent(OSType creator,StringPtr key,FSSpecPtr prefsfile,AppleEvent* theEvent);
  31. ICError LaunchFSSpec(FSSpecPtr fs,AppleEvent* theEvent);
  32. ICError SendEvent(AppleEvent* theEvent,OSType creator);
  33. OSErr FSpGetCatInfo(FSSpecPtr fs,short index,CInfoPBRec* pb);
  34. OSErr FSSpecToFullPath(FSSpecPtr fs,StringPtr path);
  35. OSErr GetVolumeStuff(StringPtr name,long date,short* vrn);
  36.  
  37. #ifdef __cplusplus
  38. }
  39. #endif
  40.  
  41. void PasStrCopy(StringPtr from,StringPtr to){
  42.     register unsigned char ch,*f,*t;
  43.     
  44.     ch=from[0];
  45.     
  46.     f=from;
  47.     t=to;
  48.     
  49.     *f=*t;
  50.     f++;
  51.     t++;
  52.     
  53.     while (ch){
  54.         *f=*t;
  55.         f++;
  56.         t++;
  57.         ch--;
  58.     }
  59.     
  60. }
  61.  
  62. ICError HaveProcessManager(void){
  63.     long gv;
  64.     
  65.     if ((Gestalt(gestaltOSAttr,&gv)==noErr)&&(gv&gestaltLaunchControl))
  66.         return (ICError)noErr;
  67.     
  68.     return (ICError)unimpErr;
  69. }
  70.  
  71. ICError CanInteract(void){
  72.     ICError err=noErr;
  73.     ProcessInfoRec info;
  74.     ProcessSerialNumber process_us,process_foreground;
  75.     Boolean result;
  76.     
  77.     if (HaveProcessManager()==noErr){
  78.         process_us.highLongOfPSN=0;
  79.         process_us.lowLongOfPSN=kCurrentProcess;
  80.         
  81.         err=GetFrontProcess(&process_foreground);
  82.         
  83.         if (err==noErr)
  84.             err=SameProcess(&process_us,&process_foreground,&result);
  85.         
  86.         if ((err==noErr)&&(!result))
  87.             err=errAENoUserInteraction;
  88.     }
  89.     
  90.     return noErr;
  91.     // should this be
  92.     // return err;
  93. }
  94.  
  95. Boolean HaveNewStandardFile(void){
  96.     long gv;
  97.     
  98.     return ((Gestalt(gestaltStandardFileAttr,&gv)==noErr)&&(gv&gestaltStandardFile58));
  99. }
  100.  
  101. Boolean HaveAliasManager(void){
  102.     long gv;
  103.     
  104.     return ((Gestalt(gestaltAliasMgrAttr,&gv)==noErr)&&(gv&gestaltAliasMgrPresent));
  105. }
  106.  
  107. Boolean FindProcess(OSType creator,OSType typ,ProcessSerialNumber* process,FSSpecPtr fs){
  108.     ProcessInfoRec info;
  109.     OSErr oe;
  110.     long gv;
  111.     
  112.     if (HaveProcessManager()==noErr){
  113.         process->highLongOfPSN=0;
  114.         process->lowLongOfPSN=kNoProcess;
  115.         info.processInfoLength=sizeof(ProcessInfoRec);
  116.         info.processName=(StringPtr)0;
  117.         info.processAppSpec=fs;
  118.         
  119.         while (GetNextProcess(process)==noErr){
  120.             if ((GetProcessInformation(process,&info)==noErr)&&(info.processType==typ)&&(info.processSignature==creator))
  121.                 return true;
  122.         }
  123.     }
  124.     
  125.     return false;
  126. }
  127.  
  128. OSErr GetVolInfo(StringPtr name,short* vrn,short index){
  129.     VolumeParam pb;
  130.     OSErr oe;
  131.     
  132.     if ((name[0]!=0)&&(name[name[0]]!=':')){
  133.         name[name[0]+1]=':';
  134.         name[0]++;
  135.     }
  136.     
  137.     pb.ioNamePtr=name;
  138.     pb.ioVRefNum=*vrn;
  139.     pb.ioVolIndex=index;
  140.     oe=PBGetVInfo((ParmBlkPtr)&pb,false);
  141.     if (oe==noErr)
  142.         *vrn=pb.ioVRefNum;
  143.     
  144.     return oe;
  145. }
  146.  
  147. OSErr ConfirmAppl(OSType creator,FSSpecPtr fss){
  148.     OSErr err;
  149.     FInfo info;
  150.     
  151.     err=HGetFInfo(fss->vRefNum,fss->parID,fss->name,&info);
  152.     
  153.     if (err==noErr){
  154.         if ((info.fdType!='APPL')||(info.fdCreator!=creator))
  155.             return afpItemNotFound;
  156.     }
  157.     
  158.     return err;
  159. }
  160.  
  161. OSErr ScanVolume(OSType creator,short vref,FSSpecPtr fs){
  162.     OSErr err;
  163.     short file_index=1;
  164.     DTPBRec pbdt;
  165.     Boolean found=false;
  166.     
  167.     fs->name[0]=0;
  168.     pbdt.ioNamePtr=fs->name;
  169.     pbdt.ioVRefNum=vref;
  170.     
  171.     err=PBDTGetPath(&pbdt);
  172.     if (err==noErr){
  173.         do {
  174.             pbdt.ioIndex=file_index;
  175.             pbdt.ioFileCreator=creator;
  176.             
  177.             err=PBDTGetAPPLSync(&pbdt);
  178.             
  179.             if (err==noErr){
  180.                 fs->vRefNum=vref;
  181.                 fs->parID=pbdt.ioAPPLParID;
  182.                 found=ConfirmAppl(creator,fs)==noErr;
  183.             }
  184.             file_index++;
  185.         } while ((!found)&&(err==noErr));
  186.     }
  187.     
  188.     return err;
  189. }
  190.  
  191. OSErr FindApplication(OSType creator,FSSpecPtr fs){
  192.     OSErr err;
  193.     short vol_index=1;
  194.     short vref;
  195.     Boolean found=false;
  196.     
  197.     do {
  198.         vref=0;
  199.         err=GetVolInfo(fs->name,&vref,vol_index);
  200.         
  201.         if (err==noErr){
  202.             err=ScanVolume(creator,vref,fs);
  203.             
  204.             if (err==noErr)
  205.                 found=true;
  206.             else 
  207.                 err=noErr;
  208.         }
  209.         
  210.         vol_index++;
  211.         
  212.     } while ((!found)&&(err==noErr));
  213.     
  214.     if (!found){
  215.         err=afpItemNotFound;
  216.         fs->vRefNum=0;
  217.         fs->parID=2;
  218.         fs->name[0]=0;
  219.     }
  220.     
  221.     return err;
  222. }
  223.  
  224. ICError PrepareToLaunch(AppleEvent* theEvent,Boolean tofront,LaunchParamBlockRec* launchThis){
  225.     AEDesc launchDesc;
  226.     OSErr err;
  227.     
  228.     err=AECoerceDesc(theEvent,typeAppParameters,&launchDesc);
  229.     
  230.     HLock((Handle)theEvent->dataHandle);
  231.     
  232.     launchThis->launchAppParameters=(AppParametersPtr)*(theEvent->dataHandle);
  233.     launchThis->launchBlockID=extendedBlock;
  234.     launchThis->launchEPBLength=extendedBlockLen;
  235.     launchThis->launchFileFlags=0;
  236.     launchThis->launchControlFlags=launchContinue | launchNoFileFlags;
  237.     if (!tofront)
  238.         launchThis->launchControlFlags |= launchDontSwitch;
  239.     
  240.     return err;
  241. }
  242.  
  243. ICError CreateGURLEvent(OSType creator,Handle urlh,AppleEvent* theEvent){
  244.     AEDesc targetAddress;
  245.     ICError err,err2;
  246.     SignedByte s;
  247.     
  248.     err=AECreateDesc(typeApplSignature,&creator,sizeof(OSType),&targetAddress);
  249.     err2=AECreateAppleEvent('GURL','GURL',&targetAddress,kAutoGenerateReturnID,kAnyTransactionID,theEvent);
  250.     
  251.     if (err==noErr)
  252.         err=err2;
  253.     
  254.     s=HGetState(urlh);
  255.     HLock(urlh);
  256.     
  257.     err2=AEPutKeyPtr(theEvent,keyDirectObject,typeChar,*urlh,GetHandleSize(urlh));
  258.     HSetState(urlh,s);
  259.     
  260.     if (err==noErr)
  261.         err=err2;
  262.     
  263.     if (err!=noErr){
  264.         AEDisposeDesc(theEvent);
  265.         theEvent=(AppleEvent*)0;
  266.     }
  267.     
  268.     AEDisposeDesc(&targetAddress);
  269.     
  270.     return err;
  271. }
  272.  
  273. ICError CreateEditPrefEvent(OSType creator,StringPtr key,FSSpecPtr prefsfile,AppleEvent* theEvent){
  274.     AEDesc targetAddress;
  275.     ICError err,err2;
  276.     
  277.     err=AECreateDesc(typeApplSignature,&creator,sizeof(OSType),&targetAddress);
  278.     err2=AECreateAppleEvent('ICAp','ICAp',&targetAddress,kAutoGenerateReturnID,kAnyTransactionID,theEvent);
  279.     if (err==noErr)
  280.         err=err2;
  281.     
  282.     err2=AEPutKeyPtr(theEvent,'----','TEXT',&(key[1]),key[0]);
  283.     if (err==noErr)
  284.         err=err2;
  285.     
  286.     err2=AEPutKeyPtr(theEvent,'dest','fss ',prefsfile,sizeof(FSSpec));
  287.     if (err==noErr)
  288.         err=err2;
  289.     
  290.     if (err!=noErr){
  291.         AEDisposeDesc(theEvent);
  292.         theEvent=(AppleEvent*)0;
  293.     }
  294.     
  295.     AEDisposeDesc(&targetAddress);
  296.     
  297.     return err;
  298. }
  299.  
  300. ICError LaunchFSSpec(FSSpecPtr fs,AppleEvent* theEvent){
  301.     LaunchParamBlockRec launchThis;
  302.     AEDesc launchDesc;
  303.     ICError err;
  304.     
  305.     launchThis.launchAppSpec=fs;
  306.     err=PrepareToLaunch(theEvent,true,&launchThis);
  307.     if (err==noErr)
  308.         err=LaunchApplication(&launchThis);
  309.     if (err==memFullErr){
  310.         launchThis.launchControlFlags |= launchUseMinimum;
  311.         err=LaunchApplication(&launchThis);
  312.     }
  313.     
  314.     return err;
  315. }
  316.  
  317. ICError SendEvent(AppleEvent* theEvent,OSType creator){
  318.     ICError err;
  319.     ProcessSerialNumber psn;
  320.     FSSpec app_fs;
  321.     AppleEvent reply;
  322.     
  323.     if (FindProcess(creator,'APPL',&psn,&app_fs)){
  324.         SetFrontProcess(&psn);
  325.         err=AESend(theEvent,&reply,kAENoReply,kAEHighPriority,kNoTimeOut,(AEIdleUPP)0,(AEFilterUPP)0);
  326.     } else {
  327.         err=FindApplication(creator,&app_fs);
  328.         if (err==noErr)
  329.             err=LaunchFSSpec(&app_fs,theEvent);
  330.     }
  331.     
  332.     return err;
  333. }
  334.  
  335. ICError EditPreferences(StringPtr key,FSSpecPtr prefsfile){
  336.     ICError err;
  337.     AppleEvent theEvent;
  338.     
  339.     err=HaveProcessManager();
  340.     if (err==noErr){
  341.         err=CreateEditPrefEvent(kICCreator,key,prefsfile,&theEvent);
  342.         if (err==noErr)
  343.             err=SendEvent(&theEvent,kICCreator);
  344.         
  345.         AEDisposeDesc(&theEvent);
  346.     }
  347.     
  348.     return err;
  349. }
  350.  
  351. ICError FindScheme(Handle urlh,StringPtr scheme){
  352.     ICError err=noErr;
  353.     char tmp=':';
  354.     
  355.     long ndx=Munger(urlh,0,&tmp,1,(Ptr)0,0);
  356.     
  357.     if ((ndx<0)||(ndx>255)){
  358.         err=icNoURLErr;
  359.     }
  360.     
  361.     if (err==noErr){
  362.         scheme[0]=ndx;
  363.         BlockMoveData(*urlh,&(scheme[1]),ndx);
  364.     }
  365.     
  366.     return err;
  367. }
  368.  
  369. ICError LaunchURL(OSType helper,Handle urlh){
  370.     ICError err;
  371.     AppleEvent theEvent;
  372.     
  373.     err=HaveProcessManager();
  374.     
  375.     if (err==noErr){
  376.         err=CreateGURLEvent(helper,urlh,&theEvent);
  377.         if (err==noErr)
  378.             err=SendEvent(&theEvent,helper);
  379.         AEDisposeDesc(&theEvent);
  380.     }
  381.     
  382.     return err;
  383. }
  384.  
  385. OSErr FSpGetCatInfo(FSSpecPtr fs,short index,CInfoPBRec* cpb){
  386.     HFileInfo* pb=&(cpb->hFileInfo);
  387.     
  388.     pb->ioVRefNum=fs->vRefNum;
  389.     pb->ioDirID=fs->parID;
  390.     pb->ioNamePtr=fs->name;
  391.     pb->ioFDirIndex=index;
  392.     
  393.     return PBGetCatInfoSync(cpb);
  394. }
  395.  
  396. OSErr FSSpecToFullPath(FSSpecPtr fs,StringPtr path){
  397.     OSErr err=noErr;
  398.     CInfoPBRec pb;
  399.     Str255 s;
  400.     
  401.     if (path==(StringPtr)0)
  402.         return paramErr;
  403.     
  404.     
  405.     if (fs->parID==1){
  406.         BlockMoveData(fs->name,path,fs->name[0]+1);
  407.         path[0]++;
  408.         path[path[0]]=':';
  409.     } else {
  410.         BlockMoveData(fs->name,s,fs->name[0]+1);
  411.         
  412.         while ((err==noErr)&&(fs->parID!=1)){
  413.             err=FSpGetCatInfo(fs,-1,&pb);
  414.             
  415.             BlockMoveData(fs->name,path,fs->name[0]+1);
  416.             path[0]++;
  417.             path[path[0]]=':';
  418.             BlockMoveData(&(s[1]),&(path[path[0]+1]),s[0]);
  419.             path[0]+=s[0];
  420.             
  421.             fs->parID=pb.hFileInfo.ioFlParID;
  422.             
  423.             BlockMoveData(path,s,path[0]+1);
  424.         }
  425.     }
  426.     
  427.     return err;
  428. }
  429.         
  430. OSErr GetVolumeStuff(StringPtr name,long date,short* vrn){
  431.     OSErr err;
  432.     VolumeParam pb;
  433.     Str255 s;
  434.     register short i,pass;
  435.     
  436.     for (pass=1;pass<3;pass++){
  437.         i=1;
  438.         while (1){
  439.             pb.ioVolIndex=i;
  440.             i++;
  441.             pb.ioNamePtr=s;
  442.             s[0]=0;
  443.             
  444.             err=PBGetVInfoSync((ParamBlockRec*)&pb);
  445.             
  446.             if (err==noErr){
  447.                 break;
  448.             }
  449.             
  450.             if (IUEqualString(name,s)==0){
  451.                 if ((pass==2)||(pb.ioVCrDate==date)){
  452.                     break;
  453.                 }
  454.             }
  455.         }
  456.         
  457.         if (err==noErr)
  458.             break;
  459.     }
  460.     
  461.     if (err==noErr)
  462.         *vrn=pb.ioVRefNum;
  463.     
  464.     return err;
  465. }
  466.  
  467. ICError ICFileSpecToFSSpec(ICFileSpecHandle filespec,Boolean can_interact,FSSpecPtr fs){
  468.     ICError err=noErr;
  469.     long loe;
  470.     long attr;
  471.     CInfoPBRec pb;
  472.     AliasHandle alias;
  473.     short aliasCount;
  474.     Boolean needsUpdate;
  475.     long rule_mask;
  476.     
  477.     if (GetHandleSize((Handle)filespec)<sizeof(ICFileSpec))
  478.         return paramErr;
  479.     
  480.     if (((*filespec)->alias.aliasSize==0)||(!HaveAliasManager())){
  481.         err=GetVolumeStuff((*filespec)->vol_name,(*filespec)->vol_creation_date,&fs->vRefNum);
  482.         
  483.         if (err==noErr){
  484.             fs->parID=(*filespec)->fss.parID;
  485.             BlockMoveData((*filespec)->fss.name,fs->name,(*filespec)->fss.name[0]+1);
  486.             err=FSpGetCatInfo(fs,0,&pb);
  487.         }
  488.     } else {
  489.         alias=(AliasHandle)filespec;
  490.         err=HandToHand((Handle*)(&alias));
  491.         if (err==noErr){
  492.             loe=Munger((Handle)alias,0,(Ptr)0,sizeof(ICFileSpec)-sizeof(AliasRecord),&loe,0);
  493.             aliasCount=0;
  494.             rule_mask=kARMSearch | kARMMountVol;
  495.             if ((!can_interact)||(CanInteract()!=noErr))
  496.                 rule_mask |= kARMNoUI;
  497.             err=MatchAlias((FSSpecPtr)0,rule_mask,alias,&aliasCount,fs,&needsUpdate,(AliasFilterUPP)0,(Ptr)0);
  498.         }
  499.         DisposeHandle((Handle)alias);
  500.     }
  501.     
  502.     return err;
  503. }
  504.  
  505. OSErr FSSpecToICFileSpec(FSSpecPtr fs,ICFileSpecHandle filespec){
  506.     AliasHandle alias;
  507.     VolumeParam pb;
  508.     OSErr err;
  509.     Str63 vname;
  510.     long loe;
  511.     
  512.     SetHandleSize((Handle)filespec,sizeof(ICFileSpec));
  513.     err=MemError();
  514.     
  515.     if (err==noErr){
  516.         pb.ioVRefNum=fs->vRefNum;
  517.         pb.ioVolIndex=0;
  518.         pb.ioNamePtr=vname;
  519.         err=PBGetVInfoSync((ParamBlockRec*)&pb);
  520.         
  521.         if (err==noErr){
  522.             (*filespec)->vol_creation_date=pb.ioVCrDate;
  523.             BlockMoveData(vname,(*filespec)->vol_name,vname[0]+1);
  524.         }
  525.         
  526.         BlockMoveData((Ptr)fs,(Ptr)&((*filespec)->fss),sizeof(FSSpec));
  527.         (*filespec)->alias.userType=(OSType)0;
  528.         (*filespec)->alias.aliasSize=0;
  529.     }
  530.     
  531.     if ((err==noErr)&&(HaveAliasManager())){
  532.         err=NewAlias((FSSpecPtr)0,fs,&alias);
  533.         
  534.         if (err==noErr){
  535.             err=HandAndHand((Handle)alias,(Handle)filespec);
  536.             if (err==noErr){
  537.                 loe=Munger((Handle)filespec,sizeof(ICFileSpec)-sizeof(AliasRecord),(Ptr)0,sizeof(AliasRecord),&loe,0);
  538.             }
  539.             DisposeHandle((Handle)alias);
  540.         }
  541.         err=noErr;
  542.     }
  543.     
  544.     return err;
  545. }
  546.  
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.